
/*
 *modbus_rtu_pal.h
 *
 * Copyright (c) 2017-2021, ucchip
 *
 * Change Logs:
 *
 * Date           Author       Notes
 *
 * 2021-06-3     lcj       the first version
 *
 * code_format:utf-8
 *
 */

#ifndef _GB_15322_PAL_H_
#define _GB_15322_PAL_H_

#include <rtthread.h>

#define PRO_HEAD 0xAA
#define PRO_TAIL 0xEE

// v1.0
#define GB18322_VERSION 1
#define GB18322_VERSION_OFFSET 1
#define GB18322_ADDR_OFFSET 2
#define GB18322_LEN_OFFSET 7

// #define FRAME_LEN_POS 7

/**gb_15322协议帧头*/

#pragma pack(1)

typedef struct
{
    rt_uint8_t precode;

    rt_uint8_t version;

    rt_uint32_t addr;

    rt_uint8_t ctl;

    rt_uint16_t datalen;

    rt_uint8_t *data;

    rt_uint8_t checksum;

    rt_uint8_t tailcode;

} s_gb_15322;

#pragma pack()

rt_int32_t gb_15322_get_addr(rt_uint8_t *head);

rt_int16_t gb_15322_head(rt_uint8_t *in, rt_uint32_t inlen);

rt_int16_t gb_15322_get_len(rt_uint8_t *head);

rt_int16_t gb_15322_tail(rt_uint8_t *in, rt_uint32_t inlen);

rt_int32_t gb_15322_checksum(rt_uint8_t *in, rt_uint32_t inlen);

/**
 * @brief       UCC协议解析
 * @param
                in 数据输入
                inlen 输入数据长度
                out 数据输出指定格式
 * @return      0:成功；其它：-1标识头不正确,2校验和不正确,3标识尾不正确,4解析的数据长度与输入数据长度不符
 * @par         创建
 *              lcj2020-7-2创建
 */
rt_int32_t gb_15322_decode(rt_uint8_t *in, rt_uint32_t inlen, void *out);

/**
 * @brief       UCC协议编码
 * @param
                in 指定格式数据输入
                inlen 输入数据长度
                out 数据输出
 * @return      0:成功；其它：-1标识头不正确,2校验和不正确,3标识尾不正确,4解析的数据长度与输入数据长度不符
 * @par         创建
 *              lcj2020-7-2创建
 */

int gb_15322_encode(void *in, char *out, int *outlen);

/**
 * @brief       由于数据可能不会一包到完，所以加入数据过滤功能，p4001协议数据过滤,每次读取一定长度后，需要反复解析，有点消耗资源，但可以确保帧完整性
 * @param       in:输入数据
                inlen 输入数据长度(增量变化的长度值，比如上一次是1，下一次可能是2)

 * @return      needlen:需要的下一组数据长度

 */
rt_int32_t gb_15322_fliter(rt_uint8_t *in, rt_uint32_t inlen);

#endif
